﻿using Autofac;
using Remember.Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Remember.Persistence.DapperNet
{
    /// <summary>
    /// MvcUI层只需要直接注册该Module即可，剩下的交由该类来完成
    /// </summary>
    public class DbModule : Module
    {
        /// <summary>
        /// 实现Autofac注册
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            if (builder == null)
                throw new ArgumentNullException("builder");

            //
            // 该代码能够实现泛型类型的注册，如果使用NHibernate或者EF的话，
            // 可以使用该代码，但是因为此处使用的是Dapper.Net，需要手写SQL
            // 语句，所以就没办法写个通用的DapperNetRepository泛型业务类了。
            //
            // builder.RegisterGeneric(typeof(NHibernateRepository<>))
            //    .As(typeof(IRepository<>))
            //    .InstancePerRequest();
            //


            // 
            // 如果TaskUserRepository继承其它接口的话（特殊查询时单独定义接口），
            // 可以在MvcUI的控制器中直接将IRepository<TaskUser>转换为对应的特殊
            // 查询接口，这样就可以使用特殊查询接口中的方法了。
            //
            builder.RegisterType<TaskUserRepository>()
                .As<IRepository<TaskUser>>()
                .InstancePerRequest();

            // 声明数据库连接对象
            builder.Register(x => new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                .InstancePerRequest();

            // 注册DbSession
            builder.Register(x => new DbSession()
            {
                DbConnection = x.Resolve<SqlConnection>()
            })
                .AsSelf()
                .InstancePerRequest();
        }
    }
}
